using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using Studio7i.Dominio;

namespace Studio7i.Persistencia
{
    public class ReservaDAO:IReserva
    {
        // Métodos CRUD
        public Reserva Crear(Reserva reservaAcrear)
        {
            string _Sentencia = "INSERT INTO Reserva(CodReserva,FechReser,Hora,Tiempo,Costo,CodUser,CodSala,CodLocal,Estado) VALUES(@CodReserva,@FechReser,@Hora,@Tiempo,@Costo,@CodUser,@CodSala,@CodLocal,@Estado)";

            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@CodReserva", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@FechReser", reservaAcrear.FechReser));
                    _Comando.Parameters.Add(new SqlParameter("@Hora", reservaAcrear.Hora));
                    _Comando.Parameters.Add(new SqlParameter("@Tiempo",reservaAcrear.Tiempo));
                    _Comando.Parameters.Add(new SqlParameter("@Costo", reservaAcrear.Costo));
                    _Comando.Parameters.Add(new SqlParameter("@CodUser", reservaAcrear.Cliente.CodUser));
                    _Comando.Parameters.Add(new SqlParameter("@CodSala", reservaAcrear.Sala.CodSala ));
                    _Comando.Parameters.Add(new SqlParameter("@CodLocal", reservaAcrear.Local.CodLocal));
                    _Comando.Parameters.Add(new SqlParameter("@Estado", reservaAcrear.Estado));
                    _Comando.ExecuteNonQuery();
                }
            }

            return Obtener(_NuevoCodigo);
        }

        public Reserva Obtener(int codigo)
        {
            string _Sentencia = "SELECT CodReserva,FechReser,Hora,Tiempo,Costo,Estado,CodUser,CodSala,CodLocal FROM Reserva WHERE CodReserva=@codigo";
            Reserva reservaCreada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            reservaCreada = new Reserva();
                            reservaCreada.CodReserva = _Resultado.GetInt32(0);
                            reservaCreada.FechReser = (DateTime)_Resultado["FechReser"];
                            reservaCreada.Hora = (int)_Resultado["Hora"];
                            reservaCreada.Tiempo = (int)_Resultado["Tiempo"];
                            reservaCreada.Costo= (int)_Resultado["Costo"];
                            reservaCreada.Estado = (int)_Resultado["Estado"];
                            reservaCreada.Cliente.CodUser = (int)_Resultado["CodUser"];
                            reservaCreada.Sala.CodSala= (int)_Resultado["CodSala"];
                            reservaCreada.Local.CodLocal = (int)_Resultado["CodLocal"];
                            
                            
                        }
                    }
                }
            }
            return reservaCreada;
        }

        public Reserva Modificar(Reserva reservaAModificar)
        {
            string _Sentencia = "UPDATE Reserva SET FechReser=@FechReser,Hora=@Hora,Tiempo=@Tiempo,Costo=@Costo,Estado=@Estado,CodUser=@CodUser,CodSala=@CodSala,CodLocal=@CodLocal  FROM Reserva  WHERE codReserva=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", reservaAModificar.CodReserva));
                    _Comando.Parameters.Add(new SqlParameter("@FechReser", reservaAModificar.FechReser));
                    _Comando.Parameters.Add(new SqlParameter("@Hora", reservaAModificar.Hora));
                    _Comando.Parameters.Add(new SqlParameter("@Tiempo", reservaAModificar.Tiempo));
                    _Comando.Parameters.Add(new SqlParameter("@Costo", reservaAModificar.Costo));
                    _Comando.Parameters.Add(new SqlParameter("@Estado", reservaAModificar.Estado));
                    _Comando.Parameters.Add(new SqlParameter("@CodUser", reservaAModificar.Cliente.CodUser));
                    _Comando.Parameters.Add(new SqlParameter("@CodSala", reservaAModificar.Sala.CodSala));
                    _Comando.Parameters.Add(new SqlParameter("@CodLocal", reservaAModificar.Local.CodLocal));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(reservaAModificar.CodReserva);
        }

        public void Eliminar(Reserva reservaAEliminar)
        {
            //string _Sentencia = "DELETE FROM Reserva WHERE codReserva=@codigo";
            string _Sentencia = "UPDATE Reserva SET Estado=2 where CodReserva=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", reservaAEliminar.CodReserva));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        // Métodos Listar
        public ICollection<Reserva> ListarTodos()
        {
            string _Sentencia = "SELECT CodReserva,FechReser,Hora,Tiempo,Costo,CodUser,CodSala,CodLocal,Estado FROM Reserva where Estado<>2";
            ICollection<Reserva> reservasEncontradas = new List<Reserva>();
            Reserva reservaCreada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            reservaCreada = new Reserva();
                            reservaCreada.CodReserva = _Resultado.GetInt32(0);
                            if (DBNull.Value.Equals(_Resultado["FechReser"])) // No hay datos en la tabla
                                reservaCreada.FechReser = DateTime.ParseExact("01-01-1900", "dd-MM-yyyy", null);
                            else
                                reservaCreada.FechReser = (DateTime)_Resultado["FechReser"];

                            if (DBNull.Value.Equals(_Resultado["Hora"])) // No hay datos en la tabla
                                reservaCreada.Hora = 0;
                            else
                                reservaCreada.Hora = (int)_Resultado["Hora"];

                            if (DBNull.Value.Equals(_Resultado["Tiempo"])) // No hay datos en la tabla
                                reservaCreada.Tiempo = 0;
                            else
                                reservaCreada.Tiempo = (int)_Resultado["Tiempo"];

                            if (DBNull.Value.Equals(_Resultado["Costo"])) // No hay datos en la tabla
                                reservaCreada.Costo = 0;
                            else
                                reservaCreada.Costo = (int)_Resultado["Costo"];

                            if (DBNull.Value.Equals(_Resultado["CodUser"])) // No hay datos en la tabla
                                reservaCreada.Cliente.CodUser = 0;
                            else
                                reservaCreada.Cliente.CodUser = (int)_Resultado["CodUser"];

                            if (DBNull.Value.Equals(_Resultado["CodSala"])) // No hay datos en la tabla
                                reservaCreada.Sala.CodSala = 0;
                            else
                                reservaCreada.Sala.CodSala = (int)_Resultado["CodSala"];


                            if (DBNull.Value.Equals(_Resultado["CodLocal"])) // No hay datos en la tabla
                                reservaCreada.Local.CodLocal = 0;
                            else
                                reservaCreada.Local.CodLocal = (int)_Resultado["CodLocal"];


                            if (DBNull.Value.Equals(_Resultado["Estado"])) // No hay datos en la tabla
                                reservaCreada.Estado = 0;
                            else
                                reservaCreada.Estado = (int)_Resultado["Estado"];

                            reservasEncontradas.Add(reservaCreada);
                        }
                    }
                }
            }
            return reservasEncontradas;
        }

        //public ICollection<Reserva> ListarReservaXNombre(string nombre)
        //{
        //    string _Sentencia = "SELECT codReserva,NombreUsuario,Clave,DNI,Nombres,Apellidos,Email,FechaNac FROM Reserva WHERE Nombres LIKE '%'+@nombre+'%'";
        //    ICollection<Reserva> reservasEncontradas = new List<Reserva>();
        //    Reserva clienteEncontrado = null;
        //    using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
        //    {
        //        _Conexion.Open();
        //        using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
        //        {
        //            _Comando.Parameters.Add(new SqlParameter("@nombre", nombre));
        //            using (SqlDataReader _Resultado = _Comando.ExecuteReader())
        //            {
        //                while (_Resultado.Read())
        //                {
        //                    clienteEncontrado = new Reserva();
        //                    clienteEncontrado.codReserva = _Resultado.GetInt32(0);
        //                    clienteEncontrado.NombreUsuario = _Resultado.GetString(1);
        //                    clienteEncontrado.Clave = (String)_Resultado["Clave"];
        //                    clienteEncontrado.DNI = (String)_Resultado["DNI"];
        //                    clienteEncontrado.Nombres = (String)_Resultado["Nombres"];
        //                    clienteEncontrado.Apellidos = (String)_Resultado["Apellidos"];
        //                    clienteEncontrado.Email = (String)_Resultado["Email"];
        //                    clienteEncontrado.FechaNac = (DateTime)_Resultado["FechaNac"];
        //                    reservasEncontradas.Add(clienteEncontrado);
        //                }
        //            }
        //        }
        //    }
        //    return reservasEncontradas;
        //}


        // Métodos de soporte*/

        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(CodReserva) FROM Reserva";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }
    }
}